//要npm i
import axios from 'axios'
/* 
在 asiox 使用 useRouter 实例化创建 router 路由对象，
    在 response 响应拦截器里为undefined访问不到 
*/
import router from '../router'
// 创建axios新实例
const axiosHttp = axios.create({
    baseURL: 'http://127.0.0.1:8080',//接口根地址
    timeout: 5000,//超时时间,
    // withCredentials:true
})


/**
 * 请求拦截器
 */
axiosHttp.interceptors.request.use(
    config => {
        // 封装token鉴权
        const token = localStorage.getItem('Token')
        if (token) {
            config.headers['Authorization'] = token
        }
        // config.headers['Access-Control-Allow-Origin']=true;
        console.log(config.headers)
        return config
    },
    err => Promise.reject(err)
)

/**
 * 响应拦截器
 */
axiosHttp.interceptors.response.use(
    res => {
        // 过滤数据
        return res
    },
    err => {
        //用以标记token是否合法
        let tokenFlag = true;
        const { response } = err
        if (response) {
            const status = response.status
            switch (status) {
                case 404:
                    ElMessage.error('资源不存在 404')
                    break;
                case 403:
                    ElMessage.error('拒绝访问 403')
                    break;
                case 401:
                    ElMessage.error('身份凭证缺失 401')
                    router.push('/')
                    localStorage.setItem("loginHistory",'-1');
                    // window.location.href = '/'
                    break;
                case 500:
                    ElMessage.error('服务器错误 500')
                    break;
                default:
                    ElMessage.error('出现意想不到的错误')
                    break;
            }
        } else {
            // 服务器崩溃问题或是网络问题
            if (!window.navigator.onLine) {
                ElMessage.error('当前网络不可用,请检查你的网络连接')
                return
            } else {
                ElMessage.error('连接服务器错误' + err.message)
                return Promise.reject(err)
            }
        }
        return Promise.reject(err)
    }
)
const showError = (msg: string) => {
    ElMessage({
        message: msg,
        grouping: true,
        type: 'error',
    })
}

export default axiosHttp
/* 
    1.Axios 支持更广泛的浏览器和 Node.js 版本，而 Fetch 只能在较新的浏览器中使用，或需要使用 polyfill 兼容旧版浏览器。
    2.Axios 可以拦截请求和响应，可以全局配置默认的请求头、超时时间等，而 Fetch 目前不支持这些功能。
    3.Axios 默认返回 JSON 格式的数据，而 Fetch 返回的是 Response 对象，需要自己通过 Response 的方法（如 json()、text() 等）将结果转换成所需的格式。
    4.Axios 对于请求错误可以直接抛出异常，方便进行错误处理，而 Fetch 的错误处理比较繁琐，需要手动检查 Response.ok 属性。
    5.fetch是原生js自带的，axios是封装的原生的xhr
 */
